package cn.siriusbot.rpc.context;

import cn.siriusbot.rpc.RpcContext;
import cn.siriusbot.rpc.entity.RpcBody;
import cn.siriusbot.rpc.entity.RpcNativeBody;

import java.lang.reflect.Method;
import java.util.UUID;

public abstract class AbstractRpcContext implements RpcContext {


    /**
     * 寻找api的类
     *
     * @param apiName api名称
     * @return api对象
     */
    protected abstract Object findApiClass(String apiName);

    /**
     * 寻找api执行的方法
     *
     * @param apiObj api对象
     * @param method api方法名称
     * @return 方法对象
     */
    protected abstract Method findApiMethod(Object apiObj, String method);

    /**
     * 将RpcBody转化为本地请求信息
     *
     * @param body json的请求信息
     * @return 本地的请求信息
     */
    @Override
    public RpcNativeBody parsecRpcBody(RpcBody body) {
        final Object apiClass = findApiClass(body.getApi());
        final Method apiMethod = findApiMethod(apiClass, body.getMethod());
        final RpcNativeBody rpcNativeBody = new RpcNativeBody()
                .setApi(apiClass)
                .setMethod(apiMethod);
        // 设置参数
        rpcNativeBody.setParam(body.getParam());
        return rpcNativeBody;
    }

    /**
     * 将本地请求信息转化为json请求信息
     *
     * @param body 本地请求信息
     * @return json请求信息
     */
    @Override
    public RpcBody toJsonRpcBody(RpcNativeBody body) {
        return new RpcBody()
                .setApi(body.getApiName())
                .setMethod(body.getMethod().getName())
                .setParam(body.getParam())
                .setId(UUID.randomUUID().toString());
    }
}
